<?php

/**
 * MLayoutProject
 *
 * Classe que trata das operacoes relacionadas a logica de negocios em Projetos de Layout
 *
 * @package models
 * @version
 */
class MLayoutProject extends Model {

    function MLayoutProject() {
        parent::Model();

        //inicializa as variaveis de upload de arquivos
        $config['upload_path'] = './uploads/';
        $config['allowed_types'] = 'txt';
        $config['max_size'] = '2048';   // KB
        $config['overwrite'] = TRUE;

        //carrega as bibliotecas necessarias para utilizacao na classe
        $this->load->library('upload', $config);
        $this->load->library('form_validation');
        $this->load->library('zip');
        $this->load->helper(array('form', 'url'));
        $this->load->helper('file');
        $this->load->helper('download');
        $this->load->model('mlayoutprojectdao', '', TRUE);
    }

    public function open() {

    //variavel para retorno dos dados de saida
        $out_data = "";

        //verifica o modo de abertura do projeto
        $op_mode = trim( $this->input->post('openprojectmode') );

        switch( $op_mode ) {
            case "byfile":
            //realiza o upload do arquivo
                if ( !$this->upload->do_upload('filedir') ) {
                //dispara um erro, caso o processo de upload tenha falhado
                    $error = $this->upload->display_errors('', '');
                    $out_data = $error;
                } else {
                //caso contrario, obtem os dados de configuracao do arquivo obtido
                    $data_cfg_upload = $this->upload->data();
                    $project_filename = $data_cfg_upload['file_name'];
                    //busca o conteudo do projeto em arquivo
                    $project_content_file = file_get_contents('./uploads/' . $project_filename);
                    //atribui o conteudo do projeto, em arquivo
                    $out_data = $project_content_file;
                }
                break;
            case "bydb":
            //obtem o ip do usuario
                $ip_user = $this->input->ip_address();
                //obtem o nome do projeto
                $project_name = trim($this->input->post('projectname'));
                //obtem o conteudo do projeto na base de dados
                $project_content_db = $this->mlayoutprojectdao->retrieve($ip_user, $project_name);
                //verifica se o projeto ja existe na base de dados
                if( $project_content_db === "" ) {
                    $info = "Este projeto nao existe no repositorio.";
                    $out_data = $info;
                } else {
                //atribui o conteudo do projeto, encontrado na base de dados
                    $out_data = $project_content_db;
                }
                break;
            default:
        }

        return $out_data;
    }

    public function create() {

    //variavel para retorno dos dados de saida
        $out_data = "";

        //realiza a validacao do formulario
        $this->form_validation->set_rules('projectname', 'Nome do Projeto', 'required|alpha_numeric');
        $this->form_validation->set_message('required', 'O campo Nome do Projeto deve ser preenchido.');
        $this->form_validation->set_message('alpha_numeric', 'O campo Nome do Projeto deve ser preenchido somente com caracteres alfanumericos (letras e/ou numeros).');
        if ( $this->form_validation->run() === FALSE ) {
        //dispara um erro, caso o processo de validacao tenha detectado alguma irregularidade nos dados fornecidos
            $error = validation_errors(' ',' ');
            $out_data = $error;
        } else {
        //obtem o nome do projeto
            $project_name = trim($this->input->post('projectname'));
            //obtem o nome do arquivo do projeto
            $project_filename = trim($this->input->post('projectname')) . '.txt';
            //cria um arquivo do projeto a partir de um template
            $file = file_get_contents('./layout_templates/template.txt');
            //edita o nome do arquivo e o nome de projeto recem-criado (em formato json)
            $project_content_edit = json_decode($file);
            $project_content_edit->name = $project_name;
            $project_content_edit->filename = $project_filename;
            $project_content = json_encode($project_content_edit);
            //atribui o conteudo do projeto
            $out_data = $project_content;
        }

        return $out_data;
    }

    public function save() {

    //decodifica o conteudo do projeto em json
        $project_content_edit = json_decode($_POST['data']);
        //obtem o nome do projeto
        $project_name = $project_content_edit->name;
        //codifica o conteudo do projeto em json
        $project_content = json_encode($project_content_edit);
        //obtem o ip do usuario
        $ip_user = $this->input->ip_address();
        //verifica se o projeto ja existe na base de dados
        if( $this->mlayoutprojectdao->retrieve($ip_user, $project_name) === "" ) {
        //se nao existir o projeto, entao insere
            $this->mlayoutprojectdao->insert($ip_user, $project_name, $project_content);
        } else {
        //caso contrario, atualiza
            $this->mlayoutprojectdao->update($ip_user, $project_name, $project_content);
        }
    }

    public function saveAs() {

    //obtem o ip do usuario
        $ip_user = $this->input->ip_address();
        //obtem o nome do projeto
        $project_name = trim($this->input->post('projectname'));
        //busca o conteudo do projeto na base de dados
        $file = $this->mlayoutprojectdao->retrieve($ip_user, $project_name);
        //efetua o download do arquivo de projeto
        $filename = $project_name . '.txt';
        force_download($filename, $file);
    }

    public function printLayout() {

    //variavel para retorno dos dados de saida
        $out_data = "";

        //define o cabecalho XML para o arquivo SVG
        $header_xml = '<?xml version="1.0" encoding="UTF-8" standalone="no"?>';
        //obtem o conteudo do projeto em formato SVG
        $project_svg_content = $_POST['data'];
        //concatena o cabecalho XML com o conteudo SVG do projeto, para obter o arquivo SVG final
        $svg_out = $header_xml . $project_svg_content;
        //define o nome do arquivo SVG final
        $svg_filename = "layoutmap.svg";
        //define o nome do arquivo de imagem do layout, sem a extensao
        $out_filename = "layoutmap";
        //define o diretorio onde sera criado o arquivo SVG (diretorio em que se encontra o conversor ImageMagick)
        $path_svg_file = getcwd() . "\\system\\application\\libraries\\imagemagick\\";
        //define o diretorio em que sera gravado o arquivo de imagem do layout
        $path_out_file = getcwd() . "\\layout_images\\";
        //variavel para definir o tipo de dados do arquivo de imagem, de acordo com o formato escolhido
        $img_data_type = "";

        //verifica o formato de arquivo escolhido
        $ext = $_POST['extensions'];
        switch( $ext ) {
            case "tpng":
            //define o nome do arquivo de saida, com extensao, e tipo de dados
                $out_filename = $out_filename . ".png";
                $img_data_type = "data:image/png;base64,";
                break;
            case "tjpg":
                $out_filename = $out_filename . ".jpg";
                $img_data_type = "data:image/jpg;base64,";
                break;
            case "tbmp":
                $out_filename = $out_filename . ".bmp";
                $img_data_type = "data:image/bmp;base64,";
                break;
            case "tpdf":
                $out_filename = $out_filename . ".pdf";
                break;
            default:
        }
        //monta e grava o arquivo SVG final
        file_put_contents($path_svg_file . $svg_filename, $svg_out);
        //verifica o sistema operacional, no lado servidor, em que a aplicacao esta executando,
        //para utilizar o executavel adequado do imagemagick
        if (stristr(PHP_OS, 'WIN')) {
        // Windows
            //converte o arquivo SVG no formato de arquivo escolhido para impressao da imagem do layout
            $imk = exec($path_svg_file."convert " . $path_svg_file.$svg_filename . " " . $path_out_file.$out_filename);
            //define o nome do arquivo de imagem gerado
            $out_data = $out_filename;
        } else {
            //conversao indisponivel
            $out_data = "noneexeconvert";
        }
        
        return $out_data;
    }

    public function getLayoutFile() {

    //obtem o nome e dados do arquivo de layout impresso
        $path_out_file = getcwd() . "\\layout_images\\";
        $filename = trim($this->input->post('filename'));
        $file = file_get_contents($path_out_file . $filename);
        //compacta o arquivo em formato zip
        $this->zip->add_data($filename, $file);
        //monta o nome do arquivo compactado
        $fn_prefix = explode(".", $filename);
        $file_zip = $fn_prefix[0] . "-" . $fn_prefix[1] . ".zip";
        //grava o arquivo compactado no diretorio
        $this->zip->archive($path_out_file . $file_zip);
        //efetua o download do arquivo compactado
        $this->zip->download($file_zip);
    }

}

/* End of file mlayoutproject.php */
/* Location: ./system/application/models/mlayoutproject.php */